A "legjobb" automount rendszer

A HupWiki-ből...

Az ivman és az autofs kombinációja. Az autofs tudja azt, hogy bizonyos idejű inaktivitás után automatikusan lecsatol. Ez megkímél attól a kényelmetlenségtől, hogy jelezni kelljen az eszköz használatának befejeztét (lecsatolás, szinkronizálás), ugyanakkor lehetővé teszi, hogy mindemellett az eszköz aszinkron legyen csatolva. A hátránya, hogy előre meg kell adni a konfigurációs fájlban az eszközöket, amiket automatikusan csatol. CD ill. floppy esetén ezzel nincs gond, de pendrive-oknál például már változhat. Itt jön képbe az ivman. Ez a HAL-lal van kapcsolatban, és automatikusan végre tud hajtani különféle parancsokat eszköz behelyezésénél és eltávolításánál. Na most az ivman nagyon rugalmas. Így én beállítottam, hogy eszköz behelyezésénél és eltávolításánál ő maga konfigurálja át a autofs-t.

Az eredmény:

  • desktop environment független automount megoldás
  • 0 mount, umount, sync


Tartalomjegyzék

Hozzávalók

  1. autofs
  2. ivman
  3. sudo

Aki nem akar módosítani az én scriptjeimen, annak ntfs-3g is kell. Az alábbiak teljes megértéséhez szükséges a hozzávalók használatának ismerete.


autofs beállítása

A következő két sor legyen az /etc/auto.master fő konfigfájlban:

/media/.auto.static     /etc/auto.static        --timeout=3
/media/.auto.ivman      /etc/auto.ivman         --timeout=3


Az /etc/auto.static-ba mennek azok, amiknek statikus az eszközfájlja. Pl. cd, dvd, floppy. Nálam ez a következőképpen néz ki:

$ cat /etc/auto.static | grep -v '#'
cdrom           -fstype=iso9660,iocharset=iso8859-2,ro,nosuid,nodev                     :/dev/cdrom
cdrom1          -fstype=auto,iocharset=iso8859-2,ro,nosuid,nodev                        :/dev/cdrom1
fd0             -fstype=auto,iocharset=iso8859-2,umask=000,quiet,rw,nosuid,nodev        :/dev/fd0

Az /etc/auto.ivman tartalmát az ivman fogja állítani.


ivman scriptek

Kell két script, ami konfigurálja az autofs-t eszköz hozzáadásánál és eltávolításánál.

Az /etc/ivman/ivman-insert hozzáad egy új bejegyzés az auto.ivman fájlhoz. Első paramétere az eszközfájl, második a fájlrendszer.

 #!/bin/bash
 
 BLOCK_DEV="$1"
 FSTYPE="$2"
 DEV_NAME="$(echo $BLOCK_DEV | cut -d '/' -f 3- | sed 's/\//_/g')"
 AUTO_IVMAN="/media/.ivman_dev_list"
 
 # Extended partíciót nem csatolok (arra a hal.volume.fstype üres sztring)
 if [ -z $FSTYPE ] ; then exit 0 ; fi
 
 # Swap partíciót nem csatolok
 if [ $FSTYPE = "swap" ] ; then exit 0 ; fi
 
 # A saját harddiskem levő cuccok ide nem kellenek, azok az fstab-ból jönnek
 if [ $(echo $BLOCK_DEV | grep '/dev/hda' | wc -l) = 1 ] ; then exit 0 ; fi
 
 case $FSTYPE in
         ext2|ext3|reiserfs|jfs|xfs)
                 MOUNT_OPT="nodev,nosuid"
                 ;;
         msdos|vfat)
                 MOUNT_OPT="dmask=000,fmask=111,codepage=852,iocharset=iso8859-2,quiet,showexec"
                 ;;
         ntfs)
                 FSTYPE="ntfs-3g"
                 MOUNT_OPT="dmask=000,fmask=111,locale=en_US.UTF8"
                 # Ehhez kell ntfs-3g. Ha nincs, akkor ezt a részt módosítani kell.
 		# MOUNT_OPT = "ro,nls=utf8,dmask=000,fmask=111"
                 ;;
         *)
                 FSTYPE="auto"
                 MOUNT_OPT="nodev,nosuid"
                 ;;
 esac
 
 # Új bejegyzés a konfigfájlba
 echo $DEV_NAME -fstype=$FSTYPE,$MOUNT_OPT :$BLOCK_DEV >> $AUTO_IVMAN
 
 # Létrehozzuk a /media/.auto.ivman-t, ha eddig nem volt
 mkdir -p /media/.auto.ivman
 
 # Újra olvastassuk a konfigfájlt
 sudo /usr/sbin/invoke-rc.d autofs reload >/dev/null 2>&1
 
 # Létrehozzuk a linket (az autofs működési elve miatt jól jön)
 ln -s .auto.ivman/$DEV_NAME /media/$DEV_NAME
 
 echo "Device $DEV_NAME plugged in."

Az /etc/ivman/ivman-remove eltávolít egy bejegyzést az auto.ivman fájlból. Egyetlen paramétere az eszközfájl.

#!/bin/bash

BLOCK_DEV="$1"
DEV_NAME="$(echo $BLOCK_DEV | cut -d '/' -f 3- | sed 's/\//_/g')"
AUTO_IVMAN="/media/.ivman_dev_list"

# Eltávolítjuk a bejegyzést
grep -v '$BLOCK_DEV' < $AUTO_IVMAN > $AUTO_IVMAN

# Ha eszköz használatban volt és az autofs még nem csatolta le, 
# akkor tudatjuk a rendszerrel, hogy most már az eszköz nem elérhető
sudo /sbin/umount -l $BLOCK_DEV >/dev/null 2>&1

# Létrehozzuk a /media/.auto.ivman-t, ha eddig nem volt
mkdir -p /media/.auto.ivman

# Újra olvastassuk a konfigfájlt
sudo /usr/sbin/invoke-rc.d autofs reload >/dev/null 2>&1

# Eltávolítjuk a linket
rm -f /media/$DEV_NAME

echo "Device $DEV_NAME removed."

Az /etc/auto.ivman egy link a /media/.ivman_dev_list-re. Később meglátjuk miért kell ez. A sudo azért kell, mert ezek a scriptek az ivman felhasználó nevében fognak futni. Tehát az /etc/sudoers-be bele kell tenni a következő két sort:

ivman   ALL=(root) NOPASSWD: /usr/sbin/invoke-rc.d autofs reload
ivman   ALL=(root) NOPASSWD: /sbin/umount -l /dev/*


Aki nem Debian alapú rendszert használ, annak az invoke-rc.d-t helyettesítenie kell valami azzal ekvivalenssel! Az /etc/auto.ivman egy link a /media/.ivman_dev_list-re.


ivman beállítása

Most beállítjuk az ivmant, hogy használja ezeket a scripteket.

$ cat /etc/ivman/IvmConfigActions.xml
<?xml version="1.0" encoding="UTF-8"?>
<ivm:ActionsConfig version="0.2" xmlns:ivm="http://www.eikke.com/ivm">
    <!-- perform these rules on devices already attached when Ivman starts -->
    <ivm:Option name="checkOnInit" value="true" />

    <!-- try to mount any mountable volume at all -->
    <!-- <ivm:Match name="ivm.mountable" value="true"> -->
    <ivm:Match name="hal.volume.is_mounted" value="false">
        <ivm:Option name="exec" value="/etc/ivman/ivman-insert '$hal.block.device$' '$hal.volume.fstype$'" />
        <ivm:Option name="execun" value="/etc/ivman/ivman-remove '$hal.block.device$'" />
    </ivm:Match>
</ivm:ActionsConfig>

Még csak annyi hiányzik, hogy kikapcsolás előtt, ha nem húzunk le valami cuccot, akkor megmarad az autofs-nek a bejegyzés, meg a linkek a /media-ban. Ezt a következőképp oldottam meg.

A /media-t tmpfs-re tettem, tehát egy sor az fstab-ba:

tmpfs /media tmpfs gid=plugdev,mode=775 0 0

Meg csináltam egy scriptet, ami a szükséges dolgokat indításnál beleteszi.

$ cat /etc/init.d/autofs-ivman-prepare
#!/bin/bash

ln -s .auto.static/cdrom        /media/cdrom
ln -s .auto.static/cdrom1       /media/dvd
ln -s .auto.static/fd0          /media/floppy

touch           /media/.ivman_dev_list
chown ivman     /media/.ivman_dev_list

mkdir /media/.auto.static

Ezt beraktam, hogy rendszerindításnál elinduljon.

$ ls -l /etc/rcS.d/S60autofs-ivman-prepare
lrwxrwxrwx 1 root root 30 2007-02-03 16:00 /etc/rcS.d/S60autofs-ivman-prepare -> ../init.d/autofs-ivman-prepare

Kész.


Forrás

A leírást utpKabel HUP írta.